package com.problem.binarySearch;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * https://leetcode-cn.com/problems/friend-circles/
 */
public class FriendCircles {

    //班上有 N 名学生。其中有些人是朋友，有些则不是。他们的友谊具有是传递性。
    // 如果已知 A 是 B 的朋友，B 是 C 的朋友，那么我们可以认为 A 也是 C 的朋友。
    // 所谓的朋友圈，是指所有朋友的集合。
    //
    //给定一个 N * N 的矩阵 M，表示班级中学生之间的朋友关系。如果M[i][j] = 1，表示已知第 i 个和 j 个学生互为朋友关系，否则为不知道。
    // 你必须输出所有学生中的已知的朋友圈总数。
    //
    //示例 1:
    //
    //输入:
    //[[1,1,0],
    // [1,1,0],
    // [0,0,1]]
    //输出: 2
    //说明：已知学生0和学生1互为朋友，他们在一个朋友圈。
    //第2个学生自己在一个朋友圈。所以返回2。
    //示例 2:
    //
    //输入:
    //[[1,1,0],
    // [1,1,1],
    // [0,1,1]]
    //输出: 1
    //说明：已知学生0和学生1互为朋友，学生1和学生2互为朋友，所以学生0和学生2也是朋友，所以他们三个在一个朋友圈，返回1。
    //注意：
    //
    //N 在[1,200]的范围内。
    //对于所有学生，有M[i][i] = 1。
    //如果有M[i][j] = 1，则有M[j][i] = 1。

    public int findCircleNum(int[][] M) {
        //每个学生的朋友列表
        List<Set<Integer>> ll = new ArrayList<>();
        for (int i=0;i<M.length;i++) {
            int[] mm = M[i];
            for (int j=0;j<mm.length;j++) {
                if (i == j) {
                    continue;
                }
                Set<Integer> iList = null;
                if (ll.size() < i + 1 || ll.get(i) == null) {
                    iList = new HashSet<>();
                    ll.add(i, iList);
                } else {
                    iList = ll.get(i);
                }
                if (mm[j] == 1) {
                    iList.add(j);
                }
            }
        }

        for (int i=0;i<ll.size();i++) {
            Set<Integer> friends =  ll.get(i);
            if (friends == null) {
                //没朋友。。
            } else {
                for (int j=0;j<ll.size();j++) {
                    if (i == j) {
                        continue;
                    }
                    Set<Integer> jFriends = ll.get(j);//j的朋友
                    if (friends.contains(j) && jFriends != null && jFriends.size()>0) {
                        friends.addAll(jFriends);
                        jFriends.addAll(friends);
                    }
                }
            }
        }
        Set<Integer> c = new HashSet<>();
        retry:
        for (int i=0;i<ll.size();i++) {

            Set<Integer> friends =  ll.get(i);
            if (friends == null || friends.size() == 0) {
                c.add(i);
            } else {
                for (int j=i;j<M.length;j++) {
                    if (i == j) {
                        continue;
                    }
                    if (!friends.contains(j)) {
                        //i和j属于不用的朋友圈
                        c.add(i);
                        c.add(j);
                        i=j;
                        continue retry;
                    }
                }
            }

        }




        return c.size()==0?1:c.size();
    }

    public static void main(String[] args) {
        int[][] M = new int[3][];
        int[] m = new int[]{1};
        int[] m0 = new int[]{1,0,0};
        int[] m1 = new int[]{0,1,0};
        int[] m2 = new int[]{0,0,1};
        M[0] = m0;
        M[1] = m1;
        M[2] = m2;
        System.out.println(new FriendCircles().findCircleNum(M));
    }
}
